package com.yugao.fintech.antelope.auth;

import com.yugao.fintech.antelope.auth.model.entity.LocalUser;
import com.yugao.fintech.antelope.auth.model.entity.OAuth2Client;
import com.yugao.fintech.antelope.auth.model.entity.SocialUser;
import com.yugao.fintech.antelope.auth.model.rqrs.CancelAccountReq;
import com.yugao.fintech.antelope.auth.model.rqrs.CaptchaCheckReq;
import com.yugao.fintech.antelope.auth.model.rqrs.LocalUserGetReq;
import com.yugao.fintech.antelope.auth.model.rqrs.LocalUserListReq;
import com.yugao.fintech.antelope.auth.model.rqrs.ldp.ExtLdpConnectResp;
import com.yugao.fintech.antelope.auth.model.rqrs.third.LoginQrcodeInfo;
import com.yugao.fintech.antelope.base.model.module.auth.LoginUser;

import java.util.List;

/**
 * 授权api
 */
public interface AuthApi {
    /**
     * 获取指定客户端所有可用的身份源
     * @param clientId 客户端id
     */
    List<ExtLdpConnectResp> listLdpConnectByClientId(String clientId);

    /**
     * 删除指定天数之前的日志
     * @param daysBefore 多少天之前的日志
     */
    void deleteLoginLog(Integer daysBefore);

    /**
     * 获取当前被授权的用户信息
     *
     * @return 用户信息
     */
    LoginUser getLoginUser();

    /**
     * 更新当前授权用户身份信息
     */
    void updateLoginUser(LoginUser loginUser);

    /**
     * 通过用户id删除访问令牌
     *
     * @param userId 用户id
     */
    boolean removeAccessTokenByUserId(Long userId);
    boolean removeAccessTokenByUserIds(List<Long> userIds);

    /**
     * 删除验证码
     * @param uuid 生成验证码时候的uuid
     */
    void deleteCaptcha(String uuid);

    /**
     * 检查验证码
     */
    boolean checkCaptcha(CaptchaCheckReq req);

    /**
     * 通过clientId 查询客户端信息
     * @param clientId 用户名
     * @return R
     */
    OAuth2Client getByClientId(String clientId);

    LocalUser getUser(LocalUserGetReq req);
    LocalUser getUserByUserId(Long userId);

    void updateLocalUser(LocalUser req);

    void deleteLocalUser(Long userId);

    void batchDeleteLocalUser(Long tenantId, List<Long> userIds);

    Long saveLocalUser(LocalUser req);

    void batchUpdateLocalUser(List<LocalUser> reqList);

    /**
     * 注销账号
     */
    void cancelAccount(CancelAccountReq req);

    List<LocalUser> listAuth(LocalUserListReq query);

    /**
     * 保存社交登录
     * @param saveData 数据
     */
    void saveThirdAuth(SocialUser saveData);

    /**
     * 通过角色id刷新客户端权限
     */
    void refreshClientAuthorityByRoleIds(List<Long> roleIds, boolean isDelete);

    /**
     * 用户进行扫码, 更新缓存信息
     */
    void userScanQrcode(LoginQrcodeInfo req);
}
